Android的:在不同的Andr​​oid版本错误上传图片上传图片、错误、不同、版本

2023-09-05 01:08:26 作者:窃笑

我有问题,在不同的Andr​​oid版本,上传图片。我需要发送图像PHP服务器,所以我使用了一个Web服务。我做测试的版本升级Froyoê糖豆,他们的作品,但在奇巧不起作用。我正在阅读有关MediaStore,我看到了不同的方式,我不,如果我的对或错。

我debbuged我的项目,我可以看到,在奇巧的路径为NULL,logcat的告诉我的Ja​​va空指针只是奇巧。我怎样才能做一个应用程序适用于所有版本。

UploadImage.java

 包br.gov.rj.barraemexposicao;

进口android.app.ProgressDialog;
进口android.content.ActivityNotFoundException;
进口android.content.Intent;
进口android.database.Cursor;
进口android.net.Uri;
进口android.provider.MediaStore;
进口android.support.v7.app.ActionBarActivity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuItem;
进口android.view.View;
进口android.widget.Button;
进口android.widget.ImageView;
进口android.widget.TextView;
进口android.widget.Toast;

进口java.io.DataOutputStream中;
进口的java.io.File;
进口java.io.FileInputStream中;
进口java.net.HttpURLConnection中;
进口java.net.MalformedURLException;
进口的java.net.URL;


公共类EnviaFoto扩展ActionBarActivity {

    最终诠释PICK_FILE_RESULT_ code = 1;
    最终诠释CAMERA_IMAGE = 2;

    TextView中的MessageText;
    按钮uploadButton;
    按钮btnTiraFoto;
    按钮selectImage;
    ImageView的imgFoto;

    INT serverResponse code = 0;
    ProgressDialog对话框= NULL;

    字符串upLoadServerUri =htt​​p://www.kweekdesign.com.br/test/recebe/Uplo​​adToServer.php;

    字符串文件路径=;


    @覆盖
    保护无效的onCreate(包savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_envia_foto);

        selectImage =(按钮)findViewById(R.id.selectImage);
        imgFoto =(ImageView的)findViewById(R.id.imgFoto);
        =的MessageText(TextView中)findViewById(R.id.messageText);
        uploadButton =(按钮)findViewById(R.id.uploadButton);
        btnTiraFoto =(按钮)findViewById(R.id.btnTiraFoto);

        upLoadServerUri =htt​​p://www.kweekdesign.com.br/test/recebe/Uplo​​adToServer.php;

        addListeners();
    }

    公共字符串uriToPath(URI URI){
        的String []投影= {MediaStore.Images.Media.DATA};
        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
        INT与Column_Index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        返回cursor.getString(Column_Index中);
    }

    @覆盖
    保护无效onActivityResult(INT申请code,INT结果code,意图数据){
        如果(数据= NULL和放大器;!及(申请code == PICK_FILE_RESULT_ code ||请求code == CAMERA_IMAGE)){

            文件路径= uriToPath(data.getData());
            imgFoto.setImageURI(data.getData());
            uploadButton.setVisibility(1);

        }
    }

    公众诠释uploadFile(字符串sourceFileUri){
        字符串文件名= sourceFileUri;

        HttpURLConnection的康恩= NULL;
        DataOutputStream类DOS = NULL;
        字符串lineEnd =\ r \ N的;
        串twoHyphens = - ;
        字符串边界=*****;
        INT读取动作,方bytesAvailable,缓冲区大小;
        byte []的缓冲区;
        INT maxBufferSize = 1 * 1024 * 1024;
        文件的SourceFile =新的文件(sourceFileUri);

        如果(!sourceFile.isFile()){

            dialog.dismiss();

            Log.e(一个UploadFile,源文件不存在:+文件路径);

            runOnUiThread(新的Runnable(){
                公共无效的run(){
                    messageText.setText(源文件不存在:+文件路径);
                }
            });

            返回0;

        }
        其他
        {
            尝试 {

                //打开一个URL连接到这个Servlet
                的FileInputStream的FileInputStream =新的FileInputStream(的资源文件);
                网址URL =新的URL(upLoadServerUri);

                //打开一个HTTP连接网址
                康恩=(HttpURLConnection类)url.openConnection();
                conn.setDoInput(真正的); //允许输入
                conn.setDoOutput(真正的); //允许输出
                conn.setUseCaches(假); //不要使用缓存副本
                conn.setRequestMethod(POST);
                conn.setRequestProperty(连接,保持活动);
                conn.setRequestProperty(ENCTYPE,多部分/表单数据);
                conn.setRequestProperty(内容类型,多部分/格式数据;边界=+界);
                conn.setRequestProperty(uploaded_file,文件名);

                DOS =新DataOutputStream类(conn.getOutputStream());

                dos.writeBytes(twoHyphens +边界+ lineEnd);
                dos.writeBytes(内容处置:表格数据;名称= \uploaded_file \;文件名= \
                        +文件名+\+ lineEnd);

                dos.writeBytes(lineEnd);

                //创建最大大小的缓冲区
                方bytesAvailable = fileInputStream.available();

                BUFFERSIZE = Math.min(方bytesAvailable,maxBufferSize);
                缓冲区=新的字节[BUFFERSIZE]

                //读取文件,并将其写入形式...
                读取动作= fileInputStream.read(缓冲液,0,BUFFERSIZE);

                而(读取动作大于0){

                    dos.write(缓冲液,0,BUFFERSIZE);
                    方bytesAvailable = fileInputStream.available();
                    BUFFERSIZE = Math.min(方bytesAvailable,maxBufferSize);
                    读取动作= fileInputStream.read(缓冲液,0,BUFFERSIZE);

                }

                //发送多部分表格数据文件数据后necesssary ...
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens +边界+ twoHyphens + lineEnd);

                从服务器//回应(code和消息)
                serverResponse code = conn.getResponse code();
                串serverResponseMessage = conn.getResponseMessage();

                Log.i(一个UploadFile,HTTP响应是:
                        + serverResponseMessage +:+ serverResponse code);

                如果(serverResponse code == 200){

                    runOnUiThread(新的Runnable(){
                        公共无效的run(){

                            弦乐味精=Envio FEITO COM Sucesso的!;

                            messageText.setText(MSG);
                            Toast.makeText(EnviaFoto.this,文件上传完成。,
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                //关闭流//
                fileInputStream.close();
                dos.flush();
                dos.close();

            }赶上(MalformedURLException的前){

                dialog.dismiss();
                ex.printStackTrace();

                runOnUiThread(新的Runnable(){
                    公共无效的run(){
                        messageText.setText(MalformedURLException的例外情况:检查脚本的网址。);
                        Toast.makeText(EnviaFoto.this,MalformedURLException的,
                                Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e(上传文件到服务器,错误:+ ex.getMessage(),前);
            }赶上(例外五){

                dialog.dismiss();
                e.printStackTrace();

                runOnUiThread(新的Runnable(){
                    公共无效的run(){
                        messageText.setText(GOT例外:看logcat的);
                        Toast.makeText(EnviaFoto.this,得到了异常:看logcat的,
                                Toast.LENGTH_SHORT).show();
                    }
                });
                Log.e(上传文件到服务器异常,异常
                        + e.getMessage(),E);
            }
            dialog.dismiss();
            返回serverResponse code;

        } //结束else块
    }

    私人无效addListeners(){

        selectImage.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图查看){
                意向意图=新的意图(Intent.ACTION_GET_CONTENT);
                意向选择器= Intent.createChooser(意向,Escolha一个照片);
                intent.setType(图像/ *);
                尝试 {
                    startActivityForResult(选配,PICK_FILE_RESULT_ code);
                }赶上(ActivityNotFoundException E){
                    Log.e(标签,e.getMessage());
                }
            }
        });

        uploadButton.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){

                对话框= ProgressDialog.show(EnviaFoto.this,,Enviando照片......,真正的);

                新主题(新的Runnable(){
                    公共字符串uriToPath(URI URI){
                        的String []投影= {MediaStore.Images.Media.DATA};
                        光标光标= managedQuery(URI,投影,NULL,NULL,NULL);
                        INT与Column_Index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        cursor.moveToFirst();
                        返回cursor.getString(Column_Index中);
                    }


                    保护无效onActivityResult(INT申请code,INT结果code,意图数据){
                        如果(数据= NULL和放大器;!&安培;请求code == PICK_FILE_RESULT_ code){

                            文件路径= uriToPath(data.getData());
                            imgFoto.setImageURI(data.getData());
                            uploadButton.setVisibility(1);

                        }
                    }公共无效的run(){
                        runOnUiThread(新的Runnable(){
                            公共无效的run(){
                                messageText.setText(Enviando照片......);
                            }
                        });

                        uploadFile(文件路径);

                    }
                })。开始();
            }
        });

        btnTiraFoto.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图查看){
                startActivityForResult(新意图(MediaStore.ACTION_IM​​AGE_CAPTURE),CAMERA_IMAGE);
            }
        });


    }


    @覆盖
    公共布尔onCreateOptionsMenu(功能菜单){
        //充气菜单;这增加了项目操作栏,如果它是present。
        。getMenuInflater()膨胀(R.menu.envia_foto,菜单);
        返回true;
    }

    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        //处理动作栏项目点击这里。将操作栏
        //自动在主/向上按钮操作的点击,只要
        //你在AndroidManifest.xml中指定一个父活动。
        INT的id = item.getItemId();
        如果(ID == R.id.action_settings){
            返回true;
        }
        返回super.onOptionsItemSelected(项目);
    }
}
 

清单

 < XML版本=1.0编码=UTF-8&GT?;
<舱单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=br.gov.rj.barraemexposicao>

    <使用-权限的Andr​​oid:名称=android.permission.INTERNET对/>
    <使用-权限的Andr​​oid:名称=android.permission.READ_EXTERNAL_STORAG​​E/>

    <用途-SDK
        安卓的minSdkVersion =8
        机器人:targetSdkVersion =19/>

    <应用
        机器人:allowBackup =真
        机器人:图标=@可绘制/ ic_launcher
        机器人:标签=@字符串/ APP_NAME
        机器人:主题=@风格/ AppTheme>
        <活动
            机器人:名称=br.gov.rj.barraemexposicao.EnviaFoto
            机器人:标签=@字符串/ APP_NAME
            机器人:screenOrientation =画像>
            <意向滤光器>

                <类机器人:名称=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;
        <活动
            机器人:名称=br.gov.rj.barraemexposicao.Enquete
            机器人:标签=@字符串/ title_activity_enquete>
            <意向滤光器>
                <作用机器人:名称=android.intent.action.MAIN/>

                <类机器人:名称=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;
    < /用途>

< /舱单>
 

LogCat中

  8月7日至四日:46:54.084 13565-13565 / br.gov.rj.barraemexposicao I /肾上腺EGL:< qeglDrvAPI_eglInitialize:410计算值:EGL 1.4高通公司构建:AU_LINUX_ANDROID_LNX .LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX.LA.3.5.1_RB1__release_AU()
    OpenGL ES的着色器编译器版本:E031.24.00.08
    建立日期:14年3月7日星期五
    当地分公司:
    远程分支:QUIC / LNX.LA.3.5.1_RB1.1
    局部修补程序:否
    重建科:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
八月七日至4日:46:54.157 13565-13565 / br.gov.rj.barraemexposicao D / OpenGLRenderer:启用调试模式0
八月七日至4日:47:03.105 13565-13565 / br.gov.rj.barraemexposicao D / AndroidRuntime:关闭虚拟机
八月七日至4日:47:03.121 13565-13565 / br.gov.rj.barraemexposicao E / AndroidRuntime:致命异常:主要
    工艺:br.gov.rj.barraemexposicao,PID:13565
    java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 2,结果= -1,数据=意向{行为=内联数据(有群众演员)}}到活动{br.gov.rj.barraemexposicao / br.gov.rj.barraemexposicao.EnviaFoto}:显示java.lang.NullPointerException:尝试在空对象引用调用虚方法java.lang.String中android.net.Uri.getScheme()
            在android.app.ActivityThread.deliverResults(ActivityThread.java:3432)
            在android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
            在android.app.ActivityThread.access $ 1300(ActivityThread.java:139)
            在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1258)
            在android.os.Handler.dispatchMessage(Handler.java:102)
            在android.os.Looper.loop(Looper.java:136)
            在android.app.ActivityThread.main(ActivityThread.java:5086)
            在java.lang.reflect.Method.invoke(本机方法)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
     显示java.lang.NullPointerException:产生的原因试图调用虚拟方法java.lang.String中android.net.Uri.getScheme()'对空对象引用
            在android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1420)
            在android.content.ContentResolver.query(ContentResolver.java:445)
            在android.content.ContentResolver.query(ContentResolver.java:404)
            在br.gov.rj.barraemexposicao.EnviaFoto.uriToPath(EnviaFoto.java:80)
            在br.gov.rj.barraemexposicao.EnviaFoto.onActivityResult(EnviaFoto.java:97)
            在android.app.Activity.dispatchActivityResult(Activity.java:5446)
            在android.app.ActivityThread.deliverResults(ActivityThread.java:3428)
在android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
在android.app.ActivityThread.access $ 1300(ActivityThread.java:139)
在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1258)
在android.os.Handler.dispatchMessage(Handler.java:102)
在android.os.Looper.loop(Looper.java:136)
在android.app.ActivityThread.main(ActivityThread.java:5086)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
八月七日至4日:47:05.066 13565-13565 / br.gov.rj.barraemexposicao I /工艺:发送信号。 PID:13565 SIG:9
八月七日至4日:51:33.298 15518-15518 / br.gov.rj.barraemexposicao I /肾上腺EGL:< qeglDrvAPI_eglInitialize:410计算值:EGL 1.4高通公司构建:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX .LA.3.5.1_RB1__release_AU()
    OpenGL ES的着色器编译器版本:E031.24.00.08
    建立日期:14年3月7日星期五
    当地分公司:
    远程分支:QUIC / LNX.LA.3.5.1_RB1.1
    局部修补程序:否
    重建科:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
八月七日至4日:51:33.393 15518-15518 / br.gov.rj.barraemexposicao D / OpenGLRenderer:启用调试模式0
八月七日至4日:52:08.015 15518-15530 / br.gov.rj.barraemexposicao W / CursorWrapperInner:没有事先关闭游标敲定()
八月七日至4日:52:10.068 15518-16522 / br.gov.rj.barraemexposicao E / AndroidRuntime:致命异常:线程34287
    工艺:br.gov.rj.barraemexposicao,PID:15518
    显示java.lang.NullPointerException:尝试在空对象引用调用虚拟方法的char [] java.lang.String.toCharArray()'
            在java.io.File.fixSlashes(File.java:185)
            在java.io.File中的< INIT>(File.java:134)
            在br.gov.rj.barraemexposicao.EnviaFoto.uploadFile(EnviaFoto.java:102)
            在br.gov.rj.barraemexposicao.EnviaFoto $ $ 6 1.运行(EnviaFoto.java:277)
            在java.lang.Thread.run(Thread.java:811)
八月七日至4日:52:10.815 15518-15518 / br.gov.rj.barraemexposicao E /窗口管理器:android.view.WindowLeaked:活动br.gov.rj.barraemexposicao.EnviaFoto渗漏窗口com.android.internal.policy。 impl.PhoneWindow $ DecorView {65280820 VE ....ř......ð0,0-684,192}最初此处添加
            在android.view.ViewRootImpl< INIT>(ViewRootImpl.java:359)
            在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            在android.app.Dialog.show(Dialog.java:286)
            在android.app.ProgressDialog.show(ProgressDialog.java:116)
            在android.app.ProgressDialog.show(ProgressDialog.java:99)
            在br.gov.rj.barraemexposicao.EnviaFoto $ 6.onClick(EnviaFoto.java:250)
            在android.view.View.performClick(View.java:4456)
            在android.view.View $ PerformClick.run(View.java:18465)
            在android.os.Handler.handleCallback(Handler.java:733)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:136)
            在android.app.ActivityThread.main(ActivityThread.java:5086)
            在java.lang.reflect.Method.invoke(本机方法)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
9月7号至四日:03:23.546 18083-18083 / br.gov.rj.barraemexposicao I /肾上腺EGL:< qeglDrvAPI_eglInitialize:410计算值:EGL 1.4高通公司构建:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX .LA.3.5.1_RB1__release_AU()
    OpenGL ES的着色器编译器版本:E031.24.00.08
    建立日期:14年3月7日星期五
    当地分公司:
    远程分支:QUIC / LNX.LA.3.5.1_RB1.1
    局部修补程序:否
    重建科:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
9月7号至四日:03:23.614 18083-18083 / br.gov.rj.barraemexposicao D / OpenGLRenderer:启用调试模式0
9月7号至四日:04:14.226 18083-18096 / br.gov.rj.barraemexposicao W / CursorWrapperInner:没有事先关闭游标敲定()
9月7号至四日:04:14.428 18083-18083 / br.gov.rj.barraemexposicao I /肾上腺EGL:< qeglDrvAPI_eglInitialize:410计算值:EGL 1.4高通公司构建:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX .LA.3.5.1_RB1__release_AU()
    OpenGL ES的着色器编译器版本:E031.24.00.08
    建立日期:14年3月7日星期五
    当地分公司:
    远程分支:QUIC / LNX.LA.3.5.1_RB1.1
    局部修补程序:否
    重建科:AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 + NOTHING
9月7号至四日:04:17.318 18083-19131 / br.gov.rj.barraemexposicao E / AndroidRuntime:致命异常:线程34498
    工艺:br.gov.rj.barraemexposicao,PID:18083
    显示java.lang.NullPointerException:尝试在空对象引用调用虚拟方法的char [] java.lang.String.toCharArray()'
            在java.io.File.fixSlashes(File.java:185)
            在java.io.File中的< INIT>(File.java:134)
            在br.gov.rj.barraemexposicao.EnviaFoto.uploadFile(EnviaFoto.java:100)
            在br.gov.rj.barraemexposicao.EnviaFoto $ $ 6 1.运行(EnviaFoto.java:275)
            在java.lang.Thread.run(Thread.java:811)
9月7号至四日:04:18.179 18083-18083 / br.gov.rj.barraemexposicao E /窗口管理器:android.view.WindowLeaked:活动br.gov.rj.barraemexposicao.EnviaFoto渗漏窗口com.android.internal.policy。 impl.PhoneWindow $ DecorView {65280100 VE ....ř......ð0,0-684,192}最初此处添加
            在android.view.ViewRootImpl< INIT>(ViewRootImpl.java:359)
            在android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            在android.app.Dialog.show(Dialog.java:286)
            在android.app.ProgressDialog.show(ProgressDialog.java:116)
            在android.app.ProgressDialog.show(ProgressDialog.java:99)
            在br.gov.rj.barraemexposicao.EnviaFoto $ 6.onClick(EnviaFoto.java:248)
            在android.view.View.performClick(View.java:4456)
            在android.view.View $ PerformClick.run(View.java:18465)
            在android.os.Handler.handleCallback(Handler.java:733)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:136)
            在android.app.ActivityThread.main(ActivityThread.java:5086)
            在java.lang.reflect.Method.invoke(本机方法)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
 

更新实例对话框后

  9月7号至4号:54:17.341 26763-26763 / br.gov.rj.barraemexposicao D / AndroidRuntime:关闭VM九月七日至4日:54:17.364 26763-26763 / br.gov.rj.barraemexposicao E / AndroidRuntime:致命异常:主要流程:br.gov.rj.barraemexposicao,PID:26763了java.lang.RuntimeException:无法实例活动ComponentInfo {br.gov.rj.barraemexposicao / BR。 gov.rj.barraemexposicao.EnviaFoto}:java.lang.InstantiationException:br.gov.rj.barraemexposicao.EnviaFoto在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2124)在android.app.ActivityThread.handleLaunchActivity(ActivityThread。 java的:2257)在android.app.ActivityThread.access $ 800(ActivityThread.java:139)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1210)在android.os.Handler.dispatchMessage(Handler.java: 102)在android.os.Looper.loop(Looper.java:136)在android.app.ActivityThread.main(ActivityThread.java:5086)在java.lang.reflect.Method.invoke(本机方法)在com.android .internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)产生的原因:java.lang.InstantiationException:br.gov.rj .barraemexposicao.EnviaFoto在java.lang.Class.newInstance(Class.java:1561)在android.app.Instrumentation.newActivity(Instrumentation.java:1084)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2115)在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)在android.app.ActivityThread.access $ 800(ActivityThread.java:139)在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1210)的机器人。 os.Handler.dispatchMessage(Handler.java:102)在android.os.Looper.loop(Looper.java:136)在android.app.ActivityThread.main(ActivityThread.java:5086)在java.lang.reflect.Method中.invoke(本机方法)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:785)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
 

解决方案

好了,关于这个例外

 显示java.lang.NullPointerException:尝试调用虚拟方法的char [] java.lang.String.toCharArray()'对空对象引用
 

您可能会在使用这种例外的图片的应用程序,但不是很经常的多媒体的应用程序。这可能是重要的是知道,因为在Android的最新版本5.0的棒棒堂的,他们已经删除的多媒体的应用程序,现在他们已经的图片的应用程序只(不同厂家拥有自己的其他内置的相片和应用程序,当然用户可以使用任何外部的应用程序也可以)

也正因为如此

和你得到`文件路径= NULL'。现在的问题是为什么是空?的。

所以可能有两方面的原因。

1日是你的 uriToPath(URI URI)方法无法正常工作和放大器;第二个是你的乌里你从获得data.getData()是不正确的。

uriToPath(URI URI)的方法似乎是正确的,所以这个问题是在你的乌里。 您可能已经注意到,如果你是获取从图像中的多媒体的应用,也有少你得到机会文件路径,但如果你正在使用的图片的应用程序的可能性加大。

这是因为你的图片的应用程序显示这可能不是你的本地设备上的照片,这些照片其实都是谷歌的服务器上。所以,当你问乌里选择一张照片,它给的乌里的是连接到该服务器。

URI可能会是这样的content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh3.googleusercontent.com%2FL-3Jm0TaSqnuKkitli5mK0-d

&放大器;它的本地设备的不行。 本地设备上的乌里会是这样

内容://媒体/外部/图片/媒体/ 49518

由于这种差别的 uriToPath(URI URI)将返回

所以检查乌里第一和放大器;因此,从获取本地设备或服务器映像。

您可以使用 DocumentsProvider API 的,所以你不必担心本地及放大器;服务器中的文件。

 私人位图getBitmapFromUri(URI URI)抛出IOException异常{
        ParcelFileDescriptor parcelFileDescriptor =
             。getContentResolver()openFileDescriptor(URI,R);
        的FileDescriptor文件描述符= parcelFileDescriptor.getFileDescriptor();
        位图图像= BitmapFactory.de codeFileDescriptor(文件描述符);
        parcelFileDescriptor.close();
        返回形象;
}
 

但如果你有一些地方的照片的图片的应用程序,然后选择那些你会得到当地的乌里的,它会给你正确的文件路径。

您也可以下载的照片的照片(这是谷歌的服务器上)的应用程序本身和放大器;以后使用它。

I am having problem with upload image in different android versions. I need to send images for php server, so i'm using a webservice. I did test with the versions Froyo e Jelly Beans, they works but the KitKat don't work. I was reading about MediaStore and I saw different ways and I don't if my its right or wrong.

I debbuged my project and I could see, in KitKat the path is NULL, Logcat tell me "Java Null Pointer" just in KitKat. How can i do a application works for all version.

UploadImage.java

package br.gov.rj.barraemexposicao;

import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;


public class EnviaFoto extends ActionBarActivity {

    final int PICK_FILE_RESULT_CODE = 1;
    final int CAMERA_IMAGE =2;

    TextView messageText;
    Button uploadButton;
    Button btnTiraFoto;
    Button selectImage;
    ImageView imgFoto;

    int serverResponseCode = 0;
    ProgressDialog dialog = null;

    String upLoadServerUri = "http://www.kweekdesign.com.br/test/recebe/UploadToServer.php";

    String filePath = "";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_envia_foto);

        selectImage = (Button) findViewById(R.id.selectImage);
        imgFoto = (ImageView) findViewById(R.id.imgFoto);
        messageText  = (TextView)findViewById(R.id.messageText);
        uploadButton = (Button)findViewById(R.id.uploadButton);
        btnTiraFoto = (Button) findViewById(R.id.btnTiraFoto);

        upLoadServerUri = "http://www.kweekdesign.com.br/test/recebe/UploadToServer.php";

        addListeners();
    }

    public String uriToPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data){
        if (data != null && (requestCode == PICK_FILE_RESULT_CODE || requestCode == CAMERA_IMAGE)){

            filePath = uriToPath(data.getData());
            imgFoto.setImageURI(data.getData());
            uploadButton.setVisibility(1);

        }
    }

    public int uploadFile(String sourceFileUri) {
        String fileName = sourceFileUri;

        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;
        File sourceFile = new File(sourceFileUri);

        if (!sourceFile.isFile()) {

            dialog.dismiss();

            Log.e("uploadFile", "Source File not exist :" + filePath);

            runOnUiThread(new Runnable() {
                public void run() {
                    messageText.setText("Source File not exist :"+filePath);
                }
            });

            return 0;

        }
        else
        {
            try {

                // open a URL connection to the Servlet
                FileInputStream fileInputStream = new FileInputStream(sourceFile);
                URL url = new URL(upLoadServerUri);

                // Open a HTTP  connection to  the URL
                conn = (HttpURLConnection) url.openConnection();
                conn.setDoInput(true); // Allow Inputs
                conn.setDoOutput(true); // Allow Outputs
                conn.setUseCaches(false); // Don't use a Cached Copy
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                conn.setRequestProperty("uploaded_file", fileName);

                dos = new DataOutputStream(conn.getOutputStream());

                dos.writeBytes(twoHyphens + boundary + lineEnd);
                dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\""
                        + fileName + "\"" + lineEnd);

                dos.writeBytes(lineEnd);

                // create a buffer of  maximum size
                bytesAvailable = fileInputStream.available();

                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                buffer = new byte[bufferSize];

                // read file and write it into form...
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                while (bytesRead > 0) {

                    dos.write(buffer, 0, bufferSize);
                    bytesAvailable = fileInputStream.available();
                    bufferSize = Math.min(bytesAvailable, maxBufferSize);
                    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

                }

                // send multipart form data necesssary after file data...
                dos.writeBytes(lineEnd);
                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                // Responses from the server (code and message)
                serverResponseCode = conn.getResponseCode();
                String serverResponseMessage = conn.getResponseMessage();

                Log.i("uploadFile", "HTTP Response is : "
                        + serverResponseMessage + ": " + serverResponseCode);

                if(serverResponseCode == 200){

                    runOnUiThread(new Runnable() {
                        public void run() {

                            String msg = "Envio feito com sucesso!";

                            messageText.setText(msg);
                            Toast.makeText(EnviaFoto.this, "File Upload Complete.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                //close the streams //
                fileInputStream.close();
                dos.flush();
                dos.close();

            } catch (MalformedURLException ex) {

                dialog.dismiss();
                ex.printStackTrace();

                runOnUiThread(new Runnable() {
                    public void run() {
                        messageText.setText("MalformedURLException Exception : check script url.");
                        Toast.makeText(EnviaFoto.this, "MalformedURLException",
                                Toast.LENGTH_SHORT).show();
                    }
                });

                Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
            } catch (Exception e) {

                dialog.dismiss();
                e.printStackTrace();

                runOnUiThread(new Runnable() {
                    public void run() {
                        messageText.setText("Got Exception : see logcat ");
                        Toast.makeText(EnviaFoto.this, "Got Exception : see logcat ",
                                Toast.LENGTH_SHORT).show();
                    }
                });
                Log.e("Upload file to server Exception", "Exception : "
                        + e.getMessage(), e);
            }
            dialog.dismiss();
            return serverResponseCode;

        } // End else block
    }

    private void addListeners(){

        selectImage.setOnClickListener(new View.OnClickListener(){
            public void onClick(View view){
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                Intent chooser = Intent.createChooser(intent,"Escolha a foto");
                intent.setType("image/*");
                try {
                    startActivityForResult(chooser, PICK_FILE_RESULT_CODE );
                }catch (ActivityNotFoundException e){
                    Log.e("tag", e.getMessage());
                }
            }
        });

        uploadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dialog = ProgressDialog.show(EnviaFoto.this, "", "Enviando foto...", true);

                new Thread(new Runnable() {
                    public String uriToPath(Uri uri) {
                        String[] projection = { MediaStore.Images.Media.DATA };
                        Cursor cursor = managedQuery(uri, projection, null, null, null);
                        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        cursor.moveToFirst();
                        return cursor.getString(column_index);
                    }


                    protected void onActivityResult (int requestCode, int resultCode, Intent data){
                        if (data != null && requestCode == PICK_FILE_RESULT_CODE){

                            filePath = uriToPath(data.getData());
                            imgFoto.setImageURI(data.getData());
                            uploadButton.setVisibility(1);

                        }
                    } public void run() {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                messageText.setText("Enviando foto...");
                            }
                        });

                        uploadFile(filePath);

                    }
                }).start();
            }
        });

        btnTiraFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), CAMERA_IMAGE);
            }
        });


    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.envia_foto, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.gov.rj.barraemexposicao" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="br.gov.rj.barraemexposicao.EnviaFoto"
            android:label="@string/app_name"
            android:screenOrientation="portrait" >
            <intent-filter>

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="br.gov.rj.barraemexposicao.Enquete"
            android:label="@string/title_activity_enquete" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

LogCat

07-04 08:46:54.084  13565-13565/br.gov.rj.barraemexposicao I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX.LA.3.5.1_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.08
    Build Date: 03/07/14 Fri
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 +  NOTHING
07-04 08:46:54.157  13565-13565/br.gov.rj.barraemexposicao D/OpenGLRenderer﹕ Enabling debug mode 0
07-04 08:47:03.105  13565-13565/br.gov.rj.barraemexposicao D/AndroidRuntime﹕ Shutting down VM
07-04 08:47:03.121  13565-13565/br.gov.rj.barraemexposicao E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: br.gov.rj.barraemexposicao, PID: 13565
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { act=inline-data (has extras) }} to activity {br.gov.rj.barraemexposicao/br.gov.rj.barraemexposicao.EnviaFoto}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3432)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
            at android.app.ActivityThread.access$1300(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.getScheme()' on a null object reference
            at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1420)
            at android.content.ContentResolver.query(ContentResolver.java:445)
            at android.content.ContentResolver.query(ContentResolver.java:404)
            at br.gov.rj.barraemexposicao.EnviaFoto.uriToPath(EnviaFoto.java:80)
            at br.gov.rj.barraemexposicao.EnviaFoto.onActivityResult(EnviaFoto.java:97)
            at android.app.Activity.dispatchActivityResult(Activity.java:5446)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3428)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3475)
            at android.app.ActivityThread.access$1300(ActivityThread.java:139)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1258)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-04 08:47:05.066  13565-13565/br.gov.rj.barraemexposicao I/Process﹕ Sending signal. PID: 13565 SIG: 9
07-04 08:51:33.298  15518-15518/br.gov.rj.barraemexposicao I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX.LA.3.5.1_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.08
    Build Date: 03/07/14 Fri
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 +  NOTHING
07-04 08:51:33.393  15518-15518/br.gov.rj.barraemexposicao D/OpenGLRenderer﹕ Enabling debug mode 0
07-04 08:52:08.015  15518-15530/br.gov.rj.barraemexposicao W/CursorWrapperInner﹕ Cursor finalized without prior close()
07-04 08:52:10.068  15518-16522/br.gov.rj.barraemexposicao E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-34287
    Process: br.gov.rj.barraemexposicao, PID: 15518
    java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
            at java.io.File.fixSlashes(File.java:185)
            at java.io.File.<init>(File.java:134)
            at br.gov.rj.barraemexposicao.EnviaFoto.uploadFile(EnviaFoto.java:102)
            at br.gov.rj.barraemexposicao.EnviaFoto$6$1.run(EnviaFoto.java:277)
            at java.lang.Thread.run(Thread.java:811)
07-04 08:52:10.815  15518-15518/br.gov.rj.barraemexposicao E/WindowManager﹕ android.view.WindowLeaked: Activity br.gov.rj.barraemexposicao.EnviaFoto has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{65280820 V.E..... R......D 0,0-684,192} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:359)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:286)
            at android.app.ProgressDialog.show(ProgressDialog.java:116)
            at android.app.ProgressDialog.show(ProgressDialog.java:99)
            at br.gov.rj.barraemexposicao.EnviaFoto$6.onClick(EnviaFoto.java:250)
            at android.view.View.performClick(View.java:4456)
            at android.view.View$PerformClick.run(View.java:18465)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-04 09:03:23.546  18083-18083/br.gov.rj.barraemexposicao I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX.LA.3.5.1_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.08
    Build Date: 03/07/14 Fri
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 +  NOTHING
07-04 09:03:23.614  18083-18083/br.gov.rj.barraemexposicao D/OpenGLRenderer﹕ Enabling debug mode 0
07-04 09:04:14.226  18083-18096/br.gov.rj.barraemexposicao W/CursorWrapperInner﹕ Cursor finalized without prior close()
07-04 09:04:14.428  18083-18083/br.gov.rj.barraemexposicao I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018_msm8226_LNX.LA.3.5.1_RB1__release_AU ()
    OpenGL ES Shader Compiler Version: E031.24.00.08
    Build Date: 03/07/14 Fri
    Local Branch:
    Remote Branch: quic/LNX.LA.3.5.1_RB1.1
    Local Patches: NONE
    Reconstruct Branch: AU_LINUX_ANDROID_LNX.LA.3.5.1_RB1.04.04.02.048.018 + f2fd134 +  NOTHING
07-04 09:04:17.318  18083-19131/br.gov.rj.barraemexposicao E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-34498
    Process: br.gov.rj.barraemexposicao, PID: 18083
    java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
            at java.io.File.fixSlashes(File.java:185)
            at java.io.File.<init>(File.java:134)
            at br.gov.rj.barraemexposicao.EnviaFoto.uploadFile(EnviaFoto.java:100)
            at br.gov.rj.barraemexposicao.EnviaFoto$6$1.run(EnviaFoto.java:275)
            at java.lang.Thread.run(Thread.java:811)
07-04 09:04:18.179  18083-18083/br.gov.rj.barraemexposicao E/WindowManager﹕ android.view.WindowLeaked: Activity br.gov.rj.barraemexposicao.EnviaFoto has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{65280100 V.E..... R......D 0,0-684,192} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:359)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:286)
            at android.app.ProgressDialog.show(ProgressDialog.java:116)
            at android.app.ProgressDialog.show(ProgressDialog.java:99)
            at br.gov.rj.barraemexposicao.EnviaFoto$6.onClick(EnviaFoto.java:248)
            at android.view.View.performClick(View.java:4456)
            at android.view.View$PerformClick.run(View.java:18465)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

Updated after Instance Dialog

07-04 09:54:17.341 26763-26763/br.gov.rj.barraemexposicao D/AndroidRuntime﹕ Shutting down VM 07-04 09:54:17.364 26763-26763/br.gov.rj.barraemexposicao E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: br.gov.rj.barraemexposicao, PID: 26763 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{br.gov.rj.barraemexposicao/br.gov.rj.barraemexposicao.EnviaFoto}: java.lang.InstantiationException: br.gov.rj.barraemexposicao.EnviaFoto at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2124) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) at android.app.ActivityThread.access$800(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5086) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) Caused by: java.lang.InstantiationException: br.gov.rj.barraemexposicao.EnviaFoto at java.lang.Class.newInstance(Class.java:1561) at android.app.Instrumentation.newActivity(Instrumentation.java:1084) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2115) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) at android.app.ActivityThread.access$800(ActivityThread.java:139) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5086) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)

解决方案

Okay, regarding this exception

java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference

You might get this exception while using Photos app, but not quite often in Gallery app. This might be important to know because in Android's latest version 5.0 Lollipop, they have removed Gallery app now they have Photos app only (Different vendors may have their own other in-built apps for photos & of course user can use any external apps also)

And because of this you are getting `filePath = null'. Now the question is why is it null?.

So there may be two reasons..

1st is your uriToPath(Uri uri) method is not working correctly & 2nd is your Uri which you are getting from data.getData() is not correct.

Your uriToPath(Uri uri) method seems to be correct, so the problem is in your Uri. You might have noticed that if you are fetching images from Gallery app, there are less chances that you are getting null in filePath, but if you are using Photos app the chances increase.

It happens because your Photos app shows photos which may not be on your local device, these photos are actually on the Google server. So when you ask for Uri by selecting a photo, it gives the Uri which is linked to that server.

The Uri might be like this content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh3.googleusercontent.com%2FL-3Jm0TaSqnuKkitli5mK0-d

& its not of your local device. Local device's Uri will be like this

content://media/external/images/media/49518

Because of this difference your uriToPath(Uri uri) is returning null.

So check the Uri first & accordingly fetch image from local device or server.

You can use DocumentsProvider API so you won't have to worry about the local & server's files.

private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
             getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
}

But if you have some local photos in Photos app then on selecting those you will get the local Uri, which will give you the correct file path.

You can also download the photos (which are on Google server) in Photos app itself & later use it.