2017-12-12 16 views
1

도움이 필요합니다. 나는 외부 microSD가 없기 때문에 사진을 찍고 스마트 폰의 내부 메모리에 저장하는 간단한 응용 프로그램을 작성 중입니다. 앱을 실행하고 사진 찍기 버튼을 누르면 크래시가 발생합니다. 어떻게 처리 할 수 ​​있습니까? 미리 감사드립니다. 여기 모니터 결과입니다사진 촬영 중 FileUriExposedException

java.lang.IllegalStateException: Could not execute method for android:onClick 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 
                       at android.view.View.performClick(View.java:5647) 
                       at android.view.View$PerformClick.run(View.java:22462) 
                       at android.os.Handler.handleCallback(Handler.java:754) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:163) 
                       at android.app.ActivityThread.main(ActivityThread.java:6205) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
                      Caused by: java.lang.reflect.InvocationTargetException 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 
                       at android.view.View.performClick(View.java:5647)  
                       at android.view.View$PerformClick.run(View.java:22462)  
                       at android.os.Handler.handleCallback(Handler.java:754)  
                       at android.os.Handler.dispatchMessage(Handler.java:95)  
                       at android.os.Looper.loop(Looper.java:163)  
                       at android.app.ActivityThread.main(ActivityThread.java:6205)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  
                      Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/AutoFare/Wed%20Dec%2013%2000%3A22%3A01%20GMT%2B04%3A00%202017.png exposed beyond app through ClipData.Item.getUri() 
                       at android.os.StrictMode.onFileUriExposed(StrictMode.java:1796) 
                       at android.net.Uri.checkFileUriExposed(Uri.java:2346) 
                       at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845) 
                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8957) 
                       at android.content.Intent.prepareToLeaveProcess(Intent.java:8942) 
                       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1519) 
                       at android.app.Activity.startActivityForResult(Activity.java:4402) 
                       at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:54) 
                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:75) 
                       at android.app.Activity.startActivityForResult(Activity.java:4360) 
                       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:708) 
                       at com.example.emilhikmett.camera.MainActivity.Takepic(MainActivity.java:45) 
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)  
                       at android.view.View.performClick(View.java:5647)  
                       at android.view.View$PerformClick.run(View.java:22462)  
                       at android.os.Handler.handleCallback(Handler.java:754)  
                       at android.os.Handler.dispatchMessage(Handler.java:95)  
                       at android.os.Looper.loop(Looper.java:163)  
                       at android.app.ActivityThread.main(ActivityThread.java:6205)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)  

MainActivity.java

import android.content.Intent; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 
import java.io.File; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity { 
private static final int CAMERA_IMAGE_REQUEST = 101; 
private String imageName; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getSupportActionBar().hide(); 
} 

public void Takepic(View view) { 
    // Creating folders for Image 
    Button one = (Button) findViewById(R.id.button16); 
    String imageFolderPath = Environment.getExternalStorageDirectory().toString() 
      + "/AutoFare"; 
    File imagesFolder = new File(imageFolderPath); 
    imagesFolder.mkdirs(); 

    // Generating file name 
    imageName = new Date().toString() + ".png"; 

    // Creating image here 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName))); 
    startActivityForResult(takePictureIntent, 
      CAMERA_IMAGE_REQUEST); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
// TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) { 

     Toast.makeText(this, "Success", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 
} 

activity_main.xml

<LinearLayout 
    android:layout_width="368dp" 
    android:layout_height="495dp" 
    tools:layout_editor_absoluteY="8dp" 
    tools:layout_editor_absoluteX="8dp" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:layout_weight="1" 
     android:paddingLeft="100dp" 
     android:paddingRight="100dp" 
     android:paddingTop="40dp"> 

     <Button 
      android:id="@+id/button16" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="take picture" 
      android:textColor="#FFFFFF" 
      android:textAlignment="textStart" 
      android:layout_marginTop="100dp" 
      android:padding="16dp" 
      android:onClick="Takepic" 
      android:clickable="true" 
      /> 


    </LinearLayout> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:orientation="vertical" 
     android:paddingLeft="50dp" 
     android:paddingRight="50dp" 
     android:paddingBottom="30dp"> 
    </LinearLayout> 



</LinearLayout> 

권한 매니페스트 파일에

추가
+0

전체 로그 cat ...을 (를) 게시했습니다. – rafsanahmad007

+0

이 (가) 추가되었습니다 .......... – Marada

답변

1

시도 : Activity.onCreate()에서

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); 
StrictMode.setVmPolicy(builder.build()); 

. 따라서 VM은 파일 URI 노출을 무시합니다.

두 번째 방법은 문제를 해결하는 대신 Fileprovider을 만드는 것입니다. 여기

Good Read

모범 사례가 설정하는 것입니다 FileProvider (당신이 링크를 볼 수 있습니다.)

StrictMode은 문제를 바로 가기 방식으로 해결하는 것보다 더 비슷합니다.

+0

첫 번째 방법은 파일 제공 업체를 사용하는 것입니다. 마지막은 엄격 모드로 어지러운 것입니다. 나쁜 조언. – greenapps

+0

그래, 나는 그렇게 생각했다 ... 나는 대답을 편집했다. 감사합니다. BTW @greenapps – rafsanahmad007